#include <bits/stdc++.h>
using namespace std;

// 并查集
int fa[100];

// 0，初始化并查集
void initDisjointset(int n)
{
    for(int i=0; i<n; i++)
        fa[i] = i;
}

// 1，查询x的帮主
int root(int x)
{
    while(fa[x] != x)
        x = fa[x];

    return x;
}

// 2，合并
// 成功：返回true
// 失败：返回false
bool merge(int a, int b)
{
    int ra = root(a);
    int rb = root(b);

    // 如果a和b本来就在一个帮派中，则无需合并直接退出
    if(ra == rb)
        return false;
    
    // 合并a和b所在的两个帮派
    fa[ra] = rb;
    return true;
}

int main(int argc, char const *argv[])
{
    // 输入n个节点、m条边
    int n, m;
    cin >> n >> m;

    // 初始化并查集
    initDisjointset(n);

    // 输入每条边(u, v)的关联端点
    // 将每个端点合并为并查集
    int u, v;
    bool loop = false;
    for(int i=0; i<m; i++)
    {
        cin >> u >> v;

        // 试图将u和v合并
        if(!merge(u, v))
            loop = true;
    }

    if(loop)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;

    return 0;
}
